iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

菜鳥的前端學習筆記系列 第 12

DAY12 - 來猜猜數字

  • 分享至 

  • xImage
  •  

前言

在進入陣列、物件和函式的世界前,今天先來試試看猜數字的題目該怎麼解吧!


解題目標

  1. 運用Math函式庫隨機生成答案數字(1-100內的數字)
  2. 為了讓電腦猜數字進行得更有效率(期望不超過10局),將從數字範圍的中數開始進行猜測判斷(答案是介於1-100的數字,電腦先從50開始猜)
  3. 當猜測的數字與答案不符時,根據數字太大或太小進行猜測範圍的動態調整
  4. 每次電腦猜的數字都與答案進行比較並記錄猜測次數

解題過程

首先,先宣告我們會使用到的變數

let answer = Math.floor(Math.random() * 100) + 1 // 莊家數字 1-100
let guess = 0 // 電腦初始數字
let count = 0 // 猜數字進行次數
let max = 100 // 猜數字範圍初始最大值
let min = 1 // 猜數字範圍初始最小值

接下來進入迴圈階段,設想的條件設計:

  1. 當電腦猜的數字與答案不符合的時候進入while迴圈
  2. 為了有效率的猜數字,設定猜測的數字每次都由最大值及最小值的中數開始猜
  3. 針對每次比較後動態調整猜測數字的範圍,如猜測的數字太大,即將下一輪猜的數字最大值設定在本次猜的數字以下(猜測數字-1),而猜測數字太小的話,便同理設定最小值(猜測數字+1)
  4. 只要進行猜測就開始記錄猜測次數,於每次輸出同時呈現目前猜測次數
while (guess !== answer) { 
  guess = Math.floor((min + max) / 2) // 電腦猜的數字從範圍最小到最大值的中數開始進行
  count++ // 準備開始比較數字大小,開始計算猜測次數

  if (guess > answer) { // 當猜的數字大於答案
    console.log(`第 ${count} 次,電腦猜 ${guess},結果 太大`)
    max = guess - 1 // 將猜數字的範圍設定在最大值到本輪數字以下為止
  } else if (guess < answer) { // 當猜的數字小於答案
    console.log(`第 ${count} 次,電腦猜 ${guess},結果 太小`)
    min = guess + 1 // 將猜數字的範圍設定在最小值從本輪數字以上開始
  } 
}
console.log(`第 ${count} 次,電腦猜 ${guess},答案是 ${answer},猜中了!`) // 當數字等於答案便會跳出迴圈輸出猜中了

其實題目有很多種解法,但要記得每次猜測完數字後需要動態調整猜數字的範圍,像是這邊使用Math.floor無條件捨去小數的情況下,如果不調整就會造成電腦猜測某些數字時(如電腦猜測範圍[(99 + 100) / 2] = 99.5,無條件捨去後還是99),會直接踏進無窮迴圈的領域。


Math函式庫

既然這裡使用了Math函式庫,就認識一下常用的幾個語法吧!

  1. Math.random()

    隨機生成0(含)到1(不含)的數值,可以運用乘上某個數字而調整random()取得的小數範圍

    console.log(Math.random() * 100) // 隨機0-100(不含100)間的小數
    
  2. Math.floor(x)

    無條件捨去到整數,很常與random()一起搭配來隨機生成數字,但使用上要注意自己取值的範圍哦(如本次題目需要生成1-100的數字時,記得後面要+1,不然無條件捨去小數生成的範圍只會是0-99間的數字)

    console.log(Math.floor(3.141596)) // 3
    
  3. Math.ceil(x)

    也是將小數轉換成整數,但與floor()不同的地方在於它是無條件進位

    console.log(Math.ceil(3.141596)) // 4
    
  4. Math.round(x)

    將小數四捨五入轉換成整數

    console.log(Math.round(3.141596)) // 3
    console.log(Math.round(3.512)) // 4
    
  5. Math.pow(x, y)

    進行x的y次方運算,與x**y相同

    console.log(Math.pow(2, 3)) // 2的3次方 8
    console.log(2 ** 3) // 8
    
  6. Math.sqrt(x)

    進行x的平方根運算

    console.log(Math.sqrt(25)) // 5
    

上一篇
DAY11 - 作用域
下一篇
DAY13 - 陣列
系列文
菜鳥的前端學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言